home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / pygtk / 2.0 / codegen / definitions.py < prev    next >
Text File  |  2006-01-20  |  19KB  |  517 lines

  1. # -*- Mode: Python; py-indent-offset: 4 -*-
  2. import sys
  3. from copy import *
  4.  
  5. def get_valid_scheme_definitions(defs):
  6.     return [x for x in defs if isinstance(x, tuple) and len(x) >= 2]
  7.  
  8. # New Parameter class, wich emulates a tuple for compatibility reasons
  9. class Parameter(object):
  10.     def __init__(self, ptype, pname, pdflt, pnull, prop=None):
  11.         self.ptype = ptype
  12.         self.pname = pname
  13.         self.pdflt = pdflt
  14.         self.pnull = pnull
  15.         
  16.     def __len__(self): return 4
  17.     def __getitem__(self, i):
  18.         return (self.ptype, self.pname, self.pdflt, self.pnull)[i]
  19.  
  20.     def merge(self, old):
  21.         if old.pdflt is not None:
  22.             self.pdflt = old.pdflt
  23.         if old.pnull is not None:
  24.             self.pnull = old.pnull
  25.  
  26. # Parameter for property based constructors
  27. class Property(object):
  28.     def __init__(self, pname, optional, argname):
  29.         self.pname = pname
  30.         self.optional = optional
  31.         self.argname = argname
  32.  
  33.     def merge(self, old):
  34.         if old.optional is not None:
  35.             self.optional = old.optional
  36.         if old.argname is not None:
  37.             self.argname = old.argname
  38.  
  39.  
  40. class Definition:
  41.     def __init__(self, *args):
  42.     """Create a new defs object of this type.  The arguments are the
  43.     components of the definition"""
  44.     raise RuntimeError, "this is an abstract class"
  45.     def merge(self, old):
  46.     """Merge in customisations from older version of definition"""
  47.     raise RuntimeError, "this is an abstract class"
  48.     def write_defs(self, fp=sys.stdout):
  49.     """write out this definition in defs file format"""
  50.     raise RuntimeError, "this is an abstract class"
  51.  
  52.     def guess_return_value_ownership(self):
  53.         "return 1 if caller owns return value"
  54.         if getattr(self, 'is_constructor_of', False):
  55.             self.caller_owns_return = True
  56.         elif self.ret in ('char*', 'gchar*', 'string'):
  57.             self.caller_owns_return = True
  58.         else:
  59.             self.caller_owns_return = False
  60.  
  61.  
  62. class ObjectDef(Definition):
  63.     def __init__(self, name, *args):
  64.     self.name = name
  65.     self.module = None
  66.     self.parent = None
  67.     self.c_name = None
  68.         self.typecode = None
  69.     self.fields = []
  70.         self.implements = []
  71.         self.class_init_func = None
  72.     for arg in get_valid_scheme_definitions(args):
  73.         if arg[0] == 'in-module':
  74.         self.module = arg[1]
  75.         elif arg[0] == 'parent':
  76.                 self.parent = arg[1]
  77.         elif arg[0] == 'c-name':
  78.         self.c_name = arg[1]
  79.         elif arg[0] == 'gtype-id':
  80.         self.typecode = arg[1]
  81.         elif arg[0] == 'fields':
  82.                 for parg in arg[1:]:
  83.                     self.fields.append((parg[0], parg[1]))
  84.             elif arg[0] == 'implements':
  85.                 self.implements.append(arg[1])
  86.     def merge(self, old):
  87.     # currently the .h parser doesn't try to work out what fields of
  88.     # an object structure should be public, so we just copy the list
  89.     # from the old version ...
  90.     self.fields = old.fields
  91.         self.implements = old.implements
  92.     def write_defs(self, fp=sys.stdout):
  93.     fp.write('(define-object ' + self.name + '\n')
  94.     if self.module:
  95.         fp.write('  (in-module "' + self.module + '")\n')
  96.     if self.parent != (None, None):    
  97.         fp.write('  (parent "' + self.parent + '")\n')
  98.         for interface in self.implements:
  99.             fp.write('  (implements "' + interface + '")\n')
  100.     if self.c_name:
  101.         fp.write('  (c-name "' + self.c_name + '")\n')
  102.     if self.typecode:
  103.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  104.         if self.fields:
  105.             fp.write('  (fields\n')
  106.             for (ftype, fname) in self.fields:
  107.                 fp.write('    \'("' + ftype + '" "' + fname + '")\n')
  108.             fp.write('  )\n')
  109.     fp.write(')\n\n')
  110.  
  111. class InterfaceDef(Definition):
  112.     def __init__(self, name, *args):
  113.     self.name = name
  114.     self.module = None
  115.     self.c_name = None
  116.         self.typecode = None
  117.         self.vtable = None
  118.     self.fields = []
  119.         self.interface_info = None
  120.     for arg in get_valid_scheme_definitions(args):
  121.         if arg[0] == 'in-module':
  122.         self.module = arg[1]
  123.         elif arg[0] == 'c-name':
  124.         self.c_name = arg[1]
  125.         elif arg[0] == 'gtype-id':
  126.         self.typecode = arg[1]
  127.         elif arg[0] == 'vtable':
  128.         self.vtable = arg[1]
  129.         if self.vtable is None:
  130.             self.vtable = self.c_name + "Iface"
  131.     def write_defs(self, fp=sys.stdout):
  132.     fp.write('(define-interface ' + self.name + '\n')
  133.     if self.module:
  134.         fp.write('  (in-module "' + self.module + '")\n')
  135.     if self.c_name:
  136.         fp.write('  (c-name "' + self.c_name + '")\n')
  137.     if self.typecode:
  138.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  139.     fp.write(')\n\n')
  140.  
  141. class EnumDef(Definition):
  142.     def __init__(self, name, *args):
  143.     self.deftype = 'enum'
  144.     self.name = name
  145.     self.in_module = None
  146.     self.c_name = None
  147.         self.typecode = None
  148.     self.values = []
  149.     for arg in get_valid_scheme_definitions(args):
  150.         if arg[0] == 'in-module':
  151.         self.in_module = arg[1]
  152.         elif arg[0] == 'c-name':
  153.         self.c_name = arg[1]
  154.         elif arg[0] == 'gtype-id':
  155.         self.typecode = arg[1]
  156.         elif arg[0] == 'values':
  157.                 for varg in arg[1:]:
  158.                     self.values.append((varg[0], varg[1]))
  159.     def merge(self, old):
  160.     pass
  161.     def write_defs(self, fp=sys.stdout):
  162.     fp.write('(define-' + self.deftype + ' ' + self.name + '\n')
  163.     if self.in_module:
  164.         fp.write('  (in-module "' + self.in_module + '")\n')
  165.     fp.write('  (c-name "' + self.c_name + '")\n')
  166.     fp.write('  (gtype-id "' + self.typecode + '")\n')
  167.         if self.values:
  168.             fp.write('  (values\n')
  169.             for name, val in self.values:
  170.                 fp.write('    \'("' + name + '" "' + val + '")\n')
  171.             fp.write('  )\n')
  172.     fp.write(')\n\n')
  173.  
  174. class FlagsDef(EnumDef):
  175.     def __init__(self, *args):
  176.     apply(EnumDef.__init__, (self,) + args)
  177.     self.deftype = 'flags'
  178.  
  179. class BoxedDef(Definition):
  180.     def __init__(self, name, *args):
  181.     self.name = name
  182.     self.module = None
  183.     self.c_name = None
  184.         self.typecode = None
  185.         self.copy = None
  186.         self.release = None
  187.     self.fields = []
  188.     for arg in get_valid_scheme_definitions(args):
  189.         if arg[0] == 'in-module':
  190.         self.module = arg[1]
  191.         elif arg[0] == 'c-name':
  192.         self.c_name = arg[1]
  193.         elif arg[0] == 'gtype-id':
  194.         self.typecode = arg[1]
  195.             elif arg[0] == 'copy-func':
  196.                 self.copy = arg[1]
  197.             elif arg[0] == 'release-func':
  198.                 self.release = arg[1]
  199.         elif arg[0] == 'fields':
  200.                 for parg in arg[1:]:
  201.                     self.fields.append((parg[0], parg[1]))
  202.     def merge(self, old):
  203.     # currently the .h parser doesn't try to work out what fields of
  204.     # an object structure should be public, so we just copy the list
  205.     # from the old version ...
  206.     self.fields = old.fields
  207.     def write_defs(self, fp=sys.stdout):
  208.     fp.write('(define-boxed ' + self.name + '\n')
  209.     if self.module:
  210.         fp.write('  (in-module "' + self.module + '")\n')
  211.     if self.c_name:
  212.         fp.write('  (c-name "' + self.c_name + '")\n')
  213.     if self.typecode:
  214.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  215.         if self.copy:
  216.             fp.write('  (copy-func "' + self.copy + '")\n')
  217.         if self.release:
  218.             fp.write('  (release-func "' + self.release + '")\n')
  219.         if self.fields:
  220.             fp.write('  (fields\n')
  221.             for (ftype, fname) in self.fields:
  222.                 fp.write('    \'("' + ftype + '" "' + fname + '")\n')
  223.             fp.write('  )\n')
  224.     fp.write(')\n\n')
  225.  
  226. class PointerDef(Definition):
  227.     def __init__(self, name, *args):
  228.     self.name = name
  229.     self.module = None
  230.     self.c_name = None
  231.         self.typecode = None
  232.     self.fields = []
  233.     for arg in get_valid_scheme_definitions(args):
  234.         if arg[0] == 'in-module':
  235.         self.module = arg[1]
  236.         elif arg[0] == 'c-name':
  237.         self.c_name = arg[1]
  238.         elif arg[0] == 'gtype-id':
  239.         self.typecode = arg[1]
  240.         elif arg[0] == 'fields':
  241.                 for parg in arg[1:]:
  242.                     self.fields.append((parg[0], parg[1]))
  243.     def merge(self, old):
  244.     # currently the .h parser doesn't try to work out what fields of
  245.     # an object structure should be public, so we just copy the list
  246.     # from the old version ...
  247.     self.fields = old.fields
  248.     def write_defs(self, fp=sys.stdout):
  249.     fp.write('(define-pointer ' + self.name + '\n')
  250.     if self.module:
  251.         fp.write('  (in-module "' + self.module + '")\n')
  252.     if self.c_name:
  253.         fp.write('  (c-name "' + self.c_name + '")\n')
  254.     if self.typecode:
  255.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  256.         if self.fields:
  257.             fp.write('  (fields\n')
  258.             for (ftype, fname) in self.fields:
  259.                 fp.write('    \'("' + ftype + '" "' + fname + '")\n')
  260.             fp.write('  )\n')
  261.     fp.write(')\n\n')
  262.  
  263. class MethodDefBase(Definition):
  264.     def __init__(self, name, *args):
  265.         dump = 0
  266.     self.name = name
  267.     self.ret = None
  268.         self.caller_owns_return = None
  269.     self.c_name = None
  270.         self.typecode = None
  271.     self.of_object = None
  272.     self.params = [] # of form (type, name, default, nullok)
  273.         self.varargs = 0
  274.         self.deprecated = None
  275.     for arg in get_valid_scheme_definitions(args):
  276.         if arg[0] == 'of-object':
  277.                 self.of_object = arg[1]
  278.         elif arg[0] == 'c-name':
  279.         self.c_name = arg[1]
  280.         elif arg[0] == 'gtype-id':
  281.         self.typecode = arg[1]
  282.         elif arg[0] == 'return-type':
  283.         self.ret = arg[1]
  284.             elif arg[0] == 'caller-owns-return':
  285.                 self.caller_owns_return = arg[1] in ('t', '#t')
  286.         elif arg[0] == 'parameters':
  287.                 for parg in arg[1:]:
  288.                     ptype = parg[0]
  289.                     pname = parg[1]
  290.                     pdflt = None
  291.                     pnull = 0
  292.                     for farg in parg[2:]:
  293.                         assert isinstance(farg, tuple)
  294.                         if farg[0] == 'default':
  295.                             pdflt = farg[1]
  296.                         elif farg[0] == 'null-ok':
  297.                             pnull = 1
  298.                     self.params.append(Parameter(ptype, pname, pdflt, pnull))
  299.             elif arg[0] == 'varargs':
  300.                 self.varargs = arg[1] in ('t', '#t')
  301.             elif arg[0] == 'deprecated':
  302.                 self.deprecated = arg[1]
  303.             else:
  304.                 sys.stderr.write("Warning: %s argument unsupported.\n" 
  305.                                  % (arg[0]))
  306.                 dump = 1
  307.         if dump:
  308.             self.write_defs(sys.stderr)
  309.  
  310.         if self.caller_owns_return is None and self.ret is not None:
  311.             self.guess_return_value_ownership()
  312.             
  313.     def merge(self, old, parmerge):
  314.         self.caller_owns_return = old.caller_owns_return
  315.         self.varargs = old.varargs
  316.     # here we merge extra parameter flags accross to the new object.
  317.         if not parmerge:
  318.             self.params = deepcopy(old.params)
  319.             return
  320.     for i in range(len(self.params)):
  321.         ptype, pname, pdflt, pnull = self.params[i]
  322.         for p2 in old.params:
  323.         if p2[1] == pname:
  324.             self.params[i] = (ptype, pname, p2[2], p2[3])
  325.             break
  326.     def _write_defs(self, fp=sys.stdout):
  327.     if self.of_object != (None, None):
  328.         fp.write('  (of-object "' + self.of_object + '")\n')
  329.     if self.c_name:
  330.         fp.write('  (c-name "' + self.c_name + '")\n')
  331.     if self.typecode:
  332.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  333.         if self.caller_owns_return:
  334.         fp.write('  (caller-owns-return #t)\n')
  335.     if self.ret:
  336.         fp.write('  (return-type "' + self.ret + '")\n')
  337.     if self.deprecated:
  338.         fp.write('  (deprecated "' + self.deprecated + '")\n')
  339.         if self.params:
  340.             fp.write('  (parameters\n')
  341.             for ptype, pname, pdflt, pnull in self.params:
  342.                 fp.write('    \'("' + ptype + '" "' + pname +'"')
  343.                 if pdflt: fp.write(' (default "' + pdflt + '")')
  344.                 if pnull: fp.write(' (null-ok)')
  345.                 fp.write(')\n')
  346.             fp.write('  )\n')
  347.     if self.varargs:
  348.         fp.write('  (varargs #t)\n')
  349.     fp.write(')\n\n')
  350.  
  351.  
  352. class MethodDef(MethodDefBase):
  353.     def __init__(self, name, *args):
  354.         MethodDefBase.__init__(self, name, *args)
  355.         for item in ('c_name', 'of_object'):
  356.             if self.__dict__[item] == None:
  357.                 self.write_defs(sys.stderr)
  358.                 raise RuntimeError, "definition missing required %s" % (item,)
  359.         
  360.     def write_defs(self, fp=sys.stdout):
  361.     fp.write('(define-method ' + self.name + '\n')
  362.         self._write_defs(fp)
  363.  
  364. class VirtualDef(MethodDefBase):
  365.     def write_defs(self, fp=sys.stdout):
  366.     fp.write('(define-virtual ' + self.name + '\n')
  367.         self._write_defs(fp)
  368.  
  369. class FunctionDef(Definition):
  370.     def __init__(self, name, *args):
  371.         dump = 0
  372.     self.name = name
  373.     self.in_module = None
  374.     self.is_constructor_of = None
  375.     self.ret = None
  376.         self.caller_owns_return = None
  377.     self.c_name = None
  378.         self.typecode = None
  379.     self.params = [] # of form (type, name, default, nullok)
  380.         self.varargs = 0
  381.         self.deprecated = None
  382.     for arg in get_valid_scheme_definitions(args):
  383.         if arg[0] == 'in-module':
  384.         self.in_module = arg[1]
  385.         elif arg[0] == 'is-constructor-of':
  386.         self.is_constructor_of = arg[1]
  387.         elif arg[0] == 'c-name':
  388.         self.c_name = arg[1]
  389.         elif arg[0] == 'gtype-id':
  390.         self.typecode = arg[1]
  391.         elif arg[0] == 'return-type':
  392.         self.ret = arg[1]
  393.             elif arg[0] == 'caller-owns-return':
  394.                 self.caller_owns_return = arg[1] in ('t', '#t')
  395.         elif arg[0] == 'parameters':
  396.                 for parg in arg[1:]:
  397.                     ptype = parg[0]
  398.                     pname = parg[1]
  399.                     pdflt = None
  400.                     pnull = 0
  401.                     for farg in parg[2:]:
  402.                         if farg[0] == 'default':
  403.                             pdflt = farg[1]
  404.                         elif farg[0] == 'null-ok':
  405.                             pnull = 1
  406.                     self.params.append(Parameter(ptype, pname, pdflt, pnull))
  407.         elif arg[0] == 'properties':
  408.                 if self.is_constructor_of is None:
  409.                     print >> sys.stderr, "Warning: (properties ...) "\
  410.                           "is only valid for constructors"
  411.                 for prop in arg[1:]:
  412.                     pname = prop[0]
  413.                     optional = False
  414.                     argname = pname
  415.                     for farg in prop[1:]:
  416.                         if farg[0] == 'optional':
  417.                             optional = True
  418.                         elif farg[0] == 'argname':
  419.                             argname = farg[1]
  420.                     self.params.append(Property(pname, optional, argname))
  421.             elif arg[0] == 'varargs':
  422.                 self.varargs = arg[1] in ('t', '#t')
  423.             elif arg[0] == 'deprecated':
  424.                 self.deprecated = arg[1]
  425.             else:
  426.                 sys.stderr.write("Warning: %s argument unsupported\n"
  427.                                  % (arg[0],))
  428.                 dump = 1
  429.         if dump:
  430.             self.write_defs(sys.stderr)
  431.  
  432.         if self.caller_owns_return is None and self.ret is not None:
  433.             self.guess_return_value_ownership()
  434.         for item in ('c_name',):
  435.             if self.__dict__[item] == None:
  436.                 self.write_defs(sys.stderr)
  437.                 raise RuntimeError, "definition missing required %s" % (item,)
  438.  
  439.     _method_write_defs = MethodDef.__dict__['write_defs']
  440.  
  441.     def merge(self, old, parmerge):
  442.         self.caller_owns_return = old.caller_owns_return
  443.         self.varargs = old.varargs
  444.         if not parmerge:
  445.             self.params = deepcopy(old.params)
  446.             return
  447.     # here we merge extra parameter flags accross to the new object.
  448.         def merge_param(param):
  449.         for old_param in old.params:
  450.         if old_param.pname == param.pname:
  451.                     if isinstance(old_param, Property):
  452.                         # h2def never scans Property's, therefore if
  453.                         # we have one it was manually written, so we
  454.                         # keep it.
  455.                         return deepcopy(old_param)
  456.                     else:
  457.                         param.merge(old_param)
  458.                         return param
  459.             raise RuntimeError, "could not find %s in old_parameters %r" % (
  460.                 param.pname, [p.pname for p in old.params])
  461.         try:
  462.             self.params = map(merge_param, self.params)
  463.         except RuntimeError:
  464.             # parameter names changed and we can't find a match; it's
  465.             # safer to keep the old parameter list untouched.
  466.             self.params = deepcopy(old.params)
  467.         
  468.     if not self.is_constructor_of:
  469.             try:
  470.                 self.is_constructor_of = old.is_constructor_of
  471.             except AttributeError:
  472.                 pass
  473.     if isinstance(old, MethodDef):
  474.         self.name = old.name
  475.         # transmogrify from function into method ...
  476.         self.write_defs = self._method_write_defs
  477.         self.of_object = old.of_object
  478.         del self.params[0]
  479.     def write_defs(self, fp=sys.stdout):
  480.     fp.write('(define-function ' + self.name + '\n')
  481.     if self.in_module:
  482.         fp.write('  (in-module "' + self.in_module + '")\n')
  483.     if self.is_constructor_of:
  484.         fp.write('  (is-constructor-of "' + self.is_constructor_of +'")\n')
  485.     if self.c_name:
  486.         fp.write('  (c-name "' + self.c_name + '")\n')
  487.     if self.typecode:
  488.         fp.write('  (gtype-id "' + self.typecode + '")\n')
  489.         if self.caller_owns_return:
  490.         fp.write('  (caller-owns-return #t)\n')
  491.     if self.ret:
  492.         fp.write('  (return-type "' + self.ret + '")\n')
  493.     if self.deprecated:
  494.         fp.write('  (deprecated "' + self.deprecated + '")\n')
  495.         if self.params:
  496.             if isinstance(self.params[0], Parameter):
  497.                 fp.write('  (parameters\n')
  498.                 for ptype, pname, pdflt, pnull in self.params:
  499.                     fp.write('    \'("' + ptype + '" "' + pname +'"')
  500.                     if pdflt: fp.write(' (default "' + pdflt + '")')
  501.                     if pnull: fp.write(' (null-ok)')
  502.                     fp.write(')\n')
  503.                 fp.write('  )\n')
  504.             elif isinstance(self.params[0], Property):
  505.                 fp.write('  (properties\n')
  506.                 for prop in self.params:
  507.                     fp.write('    \'("' + prop.pname +'"')
  508.                     if prop.optional: fp.write(' (optional)')
  509.                     fp.write(')\n')
  510.                 fp.write('  )\n')
  511.             else:
  512.                 assert False, "strange parameter list %r" % self.params[0]
  513.     if self.varargs:
  514.         fp.write('  (varargs #t)\n')
  515.  
  516.     fp.write(')\n\n')
  517.